package com.zyl.javabasic.位运算;

/**
 * @author zyl
 * @Description
 * @since 2025/3/10 21:35
 *
 * 使用移位运算符的主要原因：
 * 高效：移位运算符直接对应于处理器的移位指令。现代处理器具有专门的硬件指令来执行这些移位操作，
 * 这些指令通常在一个时钟周期内完成。相比之下，乘法和除法等算术运算在硬件层面上需要更多的时钟周期来完成。
 * 节省内存：通过移位操作，可以使用一个整数（如 int 或 long）来存储多个布尔值或标志位，从而节省内存。移位运算符最常用于快速乘以或除以 2 的幂次方。除此之外，它还在以下方面发挥着重要作用：
 * 位字段管理：例如存储和操作多个布尔值。
 * 哈希算法和加密解密：通过移位和与、或等操作来混淆数据。
 * 数据压缩：例如霍夫曼编码通过移位运算符可以快速处理和操作二进制数据，以生成紧凑的压缩格式。数据校验：例如 CRC（循环冗余校验）通过移位和多项式除法生成和校验数据完整性。。
 * 内存对齐：通过移位操作，可以轻松计算和调整数据的对齐地址。
 *
 * Java 中有三种移位运算符：
 * << :左移运算符，向左移若干位，高位丢弃，低位补零。x << n,相当于 x 乘以 2 的 n 次方(不溢出的情况下)。
 * >> :带符号右移，向右移若干位，高位补符号位，低位丢弃。正数高位补 0,负数高位补 1。x >> n,相当于 x 除以 2 的 n 次方。
 * >>> :无符号右移，忽略符号位，空位都以 0 补齐。

 *
 *
 *
 */

public class weiyunsuan {
    public static void main(String[] args) {
        int i = -1;
        System.out.println("初始数据：" + i);
        System.out.println("初始数据对应的二进制字符串：       " + Integer.toBinaryString(i));
        i <<= 10;
        System.out.println("左移 10 位后的数据 " + i);
        System.out.println("左移 10 位后的数据对应的二进制字符 " + Integer.toBinaryString(i));



        //当 int 类型左移/右移位数大于等于 32 位操作时，会先求余（%）后再进行左移/右移操作。
        // 也就是说左移/右移 32 位相当于不进行移位操作（32%32=0），左移/右移 42 位相当于左移/右移 10 位（42%32=10）。
        // 当 long 类型进行左移/右移操作时，由于 long 对应的二进制是 64 位，因此求余操作的基数也变成了 64。
        // 也就是说：x<<42等同于x<<10，x>>42等同于x>>10，x >>>42等同于x >>> 10。

        int j = -1;
        System.out.println("初始数据：" + j);
        System.out.println("初始数据对应的二进制字符串：" + Integer.toBinaryString(j));
        j <<= 42;
        System.out.println("左移 10 位后的数据 " + j);
        System.out.println("左移 10 位后的数据对应的二进制字符 " + Integer.toBinaryString(j));
    }
}
